Android Sqlite 和多列问题

Android Sqlite and Multicolumns issue

我有一个简单的 sqlite 项目(发送和检索 3 列的信息)。它运作良好。实际上,我尝试使用 3 列适配器将这些信息放入 listView -> 它看起来像这样:

但是当我 运行 我的应用程序时,我的适配器将相同的内容复制了三次,之后它进入下一列并进行相同的操作。

我想做的是从第 1 列填充 textView2 信息,从第 2 列填充 textView3...

这是构建 ArrayList 并调用 Listview 和适配器的代码:

private void populateListView() {
    Cursor data = mDatabaseHelper.getData();
    ArrayList<String> listData = new ArrayList<>();
    while (data.moveToNext()) {
        listData.add(data.getString(1));
        listData.add(data.getString(2));
        listData.add(data.getString(3));
    }

    ListDataAdapter adapter = new ListDataAdapter(this, R.layout.adapter_view_layout, listData);
    mListView.setAdapter(adapter);

对于适配器:

import android.content.Context;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.ArrayList;



class ListDataAdapter extends ArrayAdapter<String> {

private static final String TAG = "ListDataAdapter";
    private Context mContext;
    int mResource;

    public ListDataAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull ArrayList<String> objects) {
        super(context, resource, objects);
        mContext = context;
        mResource = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        String name = getItem(position).toString();
        String sex = getItem(position).toString();
        String date = getItem(position).toString();


        LayoutInflater inflater =  LayoutInflater.from(mContext);
        convertView = inflater.inflate(mResource,parent, false);


        TextView tvName = (TextView) convertView.findViewById(R.id.textView1);
        TextView tvSex = (TextView) convertView.findViewById(R.id.textView2);
        TextView tvDate = (TextView) convertView.findViewById(R.id.textView3);

        tvName.setText(name);
        tvDate.setText(date);
        tvSex.setText(sex);

        return convertView;
    }
}

如何解决这个问题?

好吧,您在三个 TextView 上设置了相同的 String,这是意料之中的。 因此,要实现您的愿望,您必须创建一个包含这 3 列的新 class。我们将其命名为 RowModel。因此,您不用使用 String,而是使用新的 class。像这样:

private void populateListView() { 
    Cursor data = mDatabaseHelper.getData();
    ArrayList<RowModel> listData = new ArrayList<>();
    while (data.moveToNext()) {
        listData.add(new RowModel(data.getString(1), data.getString(2), data.getString(3));
    } 

    ListDataAdapter adapter = new ListDataAdapter(this, R.layout.adapter_view_layout, listData);
    mListView.setAdapter(adapter);
}

那么你的适配器就是这样的:

class ListDataAdapter extends ArrayAdapter<RowModel> {

    @NonNull 
    @Override 
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        RowModel model = getItem(position);
        String name = model.getName();
        String sex = model.getSex();
        String date = model.getDate();

        // populate TextViews
    }
}