1

пытается установитьOnClickListener в элементе списка listView для изменения фона элемента списка при щелчке, поэтому я настроил SimpleCursorAdapter, как показано ниже. Он работает, но также меняет цвет других элементов списка вне экрана (на 8 шагов ниже щелкнули один, например: если щелкнул элемент родительской позиции 0, он также изменил фон в позиции 7, точно так же от 3 до 10,). У меня также есть setOnItemClickListener, который отлично работает. Не могу понять, что я сделал? Заранее спасибо.SimpleCursorAdapter дублирует действие щелчка на bindView

List view (marked child item on that setOnClickListener)

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 fuckList = lv; 
    fuckList.setAdapter(scA); 
    clickMyListItem(fuckList); 
} 

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(); 
} 





} 

ответ

0
private selectedItem = -1; 

затем на GetView добавить:

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

OnClick:

selectedItem = position; 
notifiyDataSetChanged(); 
+0

Спасибо, но не полезно – alright