【问题标题】:SimpleCursorAdapter duplicates click action on bindViewSimpleCursorAdapter 在 bindView 上重复单击操作
【发布时间】:2017-01-08 14:15:56
【问题描述】:

试图在 listView 子项上设置 OnClickListener 以在单击时更改列表项背景,因此我自定义 SimpleCursorAdapter 如下。它可以工作,但也会更改屏幕外的其他列表项颜色(比单击一个下降 8 步,例如:如果单击项目的父位置为 0 它还在位置 7 处更改了背景,以相同的方式将 3 更改为 10,)。我也有一个工作正常的 setOnItemClickListener。不明白我做错了什么?提前致谢。

import android.content.Context;
import android.database.Cursor;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;
import com.bbt.alright.imeetup.R;


public class ProgramsCA extends SimpleCursorAdapter{

public ProgramsCA(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
    super(context, layout, c, from, to, flags);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View view = inflater.inflate(R.layout.list_program, parent, false);
    return view;
}

@Override
public void bindView(View view, final Context context, Cursor cursor) {
    super.bindView(view, context, cursor);

    final ImageView iv = (ImageView) view.findViewById(R.id.imageViewCalV);
    final RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.fTheProgram);
    iv.setOnClickListener(new View.OnClickListener(){
        @Override
        public void onClick(View view) {

            View parentRow = (View) view.getParent();
            ListView listView = (ListView) parentRow.getParent();
            final int position = listView.getPositionForView(parentRow);

            iv.setBackgroundColor(Color.TRANSPARENT);
            rl.setBackgroundColor(Color.parseColor("#D98BC34A"));
            Toast.makeText(context, "Clicked "+position , Toast.LENGTH_LONG).show();
        }
    });
}
}

这是我的清单:

public class EventsList extends Fragment {
private SQLiteHandler db;
private ListView lv;
// Store instance variables
private String title;
private int page;


// newInstance constructor for creating fragment with arguments
public static EventsList newInstance(int page, String title) {
    EventsList fragmentFirst = new EventsList();
    Bundle args = new Bundle();
    args.putInt("someInt", page);
    args.putString("someTitle", title);
    fragmentFirst.setArguments(args);
    return fragmentFirst;
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    page = getArguments().getInt("someInt", 0);
    title = getArguments().getString("someTitle");
}


@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    db = new SQLiteHandler(getActivity().getApplicationContext());
    View view = inflater.inflate(R.layout.frag_event_list,container,false);
    lv = (ListView) view.findViewById(R.id.programs_list);

    makeMyList();
    return view;
}

public void makeMyList() {
    Cursor cursor = db.getEventsByDate(title);

    String[] source = new String[]
            {
                    AppConfig.EVENT_NAME,
                    AppConfig.EVENT_TIME,
            };

    int[] toView = new int[]
            {
                    R.id.event_title,
                    R.id.event_time,
            };

    ProgramsCA scA = new ProgramsCA
            (
                    getActivity(),
                    R.layout.list_program,
                    cursor,
                    source,
                    toView,
                    1
            );

    ListView myList = lv;
    myList.setAdapter(scA);
    clickMyListItem(myList);
}

public void clickMyListItem(ListView lv)
{
    lv.setOnItemClickListener(new AdapterView.OnItemClickListener(){
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
            Cursor cursor = (Cursor) adapterView.getItemAtPosition(i);
            int iCol_Name = cursor.getColumnIndex(AppConfig.EVENT_SERVER_ID);
            int sid = cursor.getInt(iCol_Name);

            Intent intent = new Intent(getActivity().getBaseContext(),
                    ItemActivity.class);
            intent.putExtra("icon", (int) R.drawable.ic_action_event);
            intent.putExtra("title", "Program Detail");
            intent.putExtra("s_id", (int) sid);
            getActivity().startActivity(intent);
        }
    });

}



public void myClickHandler(View v)
{
    ListView lvItems = lv;
    for (int i=0; i < lvItems.getChildCount(); i++)
    {
        lvItems.getChildAt(i).setBackgroundColor(Color.BLUE);
    }
    //get the row the clicked button is in
    RelativeLayout vwParentRow = (RelativeLayout)v.getParent();

    int c = Color.CYAN;

    vwParentRow.setBackgroundColor(c);
    vwParentRow.refreshDrawableState();
}





} 

【问题讨论】:

    标签: android listview onclicklistener simplecursoradapter listviewitem


    【解决方案1】:
    private selectedItem = -1;
    

    然后在 getView 上添加:

    if(position == selectedItem)
    //set selected background color 
    else 
    //set normal background color 
    

    点击:

    selectedItem = position;
    notifiyDataSetChanged();
    

    【讨论】:

    • 谢谢,但没有帮助
    【解决方案2】:

    试试这个:

    private int selectedItemSid = -1;
    
    @Override
    public void bindView(View view, final Context context, Cursor cursor) {
        super.bindView(view, context, cursor);
    
        final ImageView iv = (ImageView) view.findViewById(R.id.imageViewCalV);
        final RelativeLayout rl = (RelativeLayout) view.findViewById(R.id.fTheProgram);
        int iCol_Name = cursor.getColumnIndex(AppConfig.EVENT_SERVER_ID);
        final int sid = cursor.getInt(iCol_Name);
        if (sid == selectedItemSid) {
            iv.setBackgroundColor(Color.TRANSPARENT);
            rl.setBackgroundColor(Color.parseColor("#D98BC34A"));
        } else {//set normal background color,assume white
            iv.setBackgroundColor(Color.WHITE);
            rl.setBackgroundColor(Color.WHITE));
        }
        iv.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View view) {
                selectedItemSid = sid;
                notifiyDataSetChanged();
            }
        });
     }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 2016-03-26
      相关资源
      最近更新 更多