创建自定义的简单光标适配器

创建自定义的简单光标适配器

本文介绍了创建自定义的简单光标适配器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想创建一个非常简单的光标自定义光标适配器,以便在单击时更改行项目的颜色.使用以下代码

I want to create a very simple cursor custom cursor adapter to facilitate changing the colors of row items on click. Using the following code

private static int save = -1;

public void onListItemClick(ListView parent, View v, int position, long id) {

    parent.getChildAt(position).setBackgroundColor(Color.BLUE);

    if (save != -1 && save != position){
        parent.getChildAt(save).setBackgroundColor(Color.BLACK);
    }

    save = position;

}

我从这个帖子中得到了代码https://stackoverflow.com/a/7649880/498449

I got the code from this thread https://stackoverflow.com/a/7649880/498449

我会使用一个简单的光标适配器并将代码放在 onClick 中,但是因为 ListFragment 中的默认列表重用视图,所以当您滚动多个视图时会突出显示.谈到 IRC,有人建议我创建一个自定义光标适配器.但是,我似乎无法找到如何执行此操作的最佳实践,以及上面的代码片段适合的位置.非常感谢您的帮助.

I would have used a simple cursor adapter and placed the code in the onClick, but because the default list in the ListFragment reuses views, as you scroll multiple views are shown to be highlighted. Talking on IRC, it was suggested that I create a custom cursor adapter. However, I can't seem to locate the best practice how how to do this, and where the above code snippet would fit in. Could greatly appreciate the help.

public class AreaCursorAdapter extends CursorAdapter {
    private Context context;


    public AreaCursorAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub
    }

    @Override
public void bindView(View view, Context context, Cursor cursor) {
    TextView list_item = (TextView)view.findViewById(android.R.id.text1);
    list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME)));

}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    LayoutInflater inflater = LayoutInflater.from(context);
    View v = inflater.inflate(android.R.layout.simple_list_item_1, parent, false);
    bindView(v, context, cursor);
    return v;
}

}

我已经用我在网上找到的一些代码更新了游标适配器.但是,我有两个问题.1. 我使用的是游标加载器,所以我没有要传递给构造函数的游标"对象.2. 我收到来自 Eclipse 的警告,提示构造函数已被弃用.

I've updated the cursor adapter with some code I found online. However, I have two problems. 1. I am using a cursor loader, so I don't have a "cursor" object to pass into the constructor. 2. I'm getting a warning from Eclipse that the constructor has been deprecated.

推荐答案

你应该可以这样做:

class YourListFragment extends ListFragmentOrSomethingElse {
    private AreaCursorAdapter mAdapter;

    @Override
    public void onCreate() {
        mAdapter = new AreaCursorAdapter(this, null);
        setListAdapter(mAdapter);
    }

    @Override
    public void onListItemClick(ListView parent, View v, int position, long id) {
        mAdapter.setSelectedPosition(position);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        mAdapter.swapCursor(cursor);
        // should reset that here maybe
        mAdapter.setSelectedPosition(-1);
    }
}

public class AreaCursorAdapter extends CursorAdapter {
    private Context context;
    private int mSelectedPosition;
    LayoutInflater mInflater;

    public AreaCursorAdapter(Context context, Cursor c) {
        // that constructor should be used with loaders.
        super(context, c, 0);
        mInflater = LayoutInflater.from(context);
    }

    public void setSelectedPosition(int position) {
        mSelectedPosition = position;
        // something has changed.
        notifyDataSetChanged();
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        TextView list_item = (TextView)view.findViewById(android.R.id.text1);
        list_item.setText(cursor.getString(cursor.getColumnIndex(INDICATOR_NAME)));
        int position = cursor.getPosition(); // that should be the same position
        if (mSelectedPosition == position) {
           view.setBackgroundColor(Color.RED);
        } else {
           view.setBackgroundColor(Color.WHITE);
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        View v = mInflater.inflate(android.R.layout.simple_list_item_1, parent, false);
        // edit: no need to call bindView here. That's done automatically
        return v;
    }

}

这篇关于创建自定义的简单光标适配器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-27 13:02