Я пытаюсь найти решение для следующей перечисленной проблемы. У меня есть Listview
сгенерированный с помощью Simpleadapter
. Когда я нажимаю на строку в списке, я хочу создать макет с colorful
цветом. Я могу это сделать. Но моя проблема начинается здесь. Когда я нажимаю на другую строку, скажем, номер строки 5, отображается яркая раскладка, но макет также отображается и для ранее щелкнутой строки. То, что я хочу сделать, - сделать макет красочным видимым только для щелкнутой строки (т.е. Он должен быть видимым только для одной строки за раз, т.е. в данный момент нажата строка и скрыта для всех остальных строк), и макет должен стать невидимым для ранее щелкнул строки. Я пробовал делать с viewholder
но это не помогает. Ниже приведен фрагмент кода. Направляйте меня шаг за шагом, поскольку я очень новичок в Android.
final BaseAdapter k=new SimpleAdapter(getActivity(),val,R.layout.mytaskdata,new String[]{"sname","heading","desc","id","path","receiver","sender"},new int[]{R.id.textView1,R.id.textView2,R.id.textView3,R.id.hide1,R.id.hide2,R.id.hide3,R.id.hide4})
{
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
final View v = super.getView(position, convertView, parent);
TextView myname=(TextView)v.findViewById(R.id.textView1);
TextView mydes=(TextView)v.findViewById(R.id.textView2);
TextView mytopic=(TextView)v.findViewById(R.id.textView3);
ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);
sent.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
RelativeLayout r=(RelativeLayout)arg1.findViewById(R.id.colorful);
// r.setVisibility(arg1.VISIBLE);
int temp=sent.getCheckedItemPosition();
Log.i("itemposition",""+temp);
Toast.makeText(getActivity(),"pos"+arg2+"hii"+positionThatSaysHi,1000).show();
if(arg2!=positionThatSaysHi)
{
r.setVisibility(arg1.VISIBLE);
positionThatSaysHi = arg2;
notifyDataSetChanged();
}
else
{
r.setVisibility(arg1.GONE);
notifyDataSetChanged();
}
});
Я бы предложил изменить OnClickListener
чтобы просто записать выбранную строку, а затем вызвать notifyDataSetChanged()
. Это приведет к тому, что ListView будет перерисовывать свои элементы, вызвав адаптер. Поэтому вам просто нужно проверить это значение в getView()
чтобы определить, должно ли "красочное" представление быть видимым или нет.
Таким образом, обновленный код будет выглядеть примерно так:
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
final View v = super.getView(position, convertView, parent);
TextView myname=(TextView)v.findViewById(R.id.textView1);
TextView mydes=(TextView)v.findViewById(R.id.textView2);
TextView mytopic=(TextView)v.findViewById(R.id.textView3);
ImageView edit=(ImageView)v.findViewById(R.id.ImageView03);
RelativeLayout r = (RelativeLayout)v.findViewById(R.id.colorful)
r.setVisibility(position == positionThatSaysHi ? View.VISIBLE : View.GONE);
sent.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3)
{
positionThatSaysHi = arg2;
notifyDataSetChanged();
}
});
}
Таким образом, вы убедитесь, что будет выделено только одно представление (в то же время упростив ваш код).
Воспользуйтесь режимом выбора в ListView (см. SetChoiceMode()) и установите его в CHOICE_MODE_SINGLE.
Используйте режим выбора, чтобы переключить видимость вашей красочной компоновки. Если возможно, самый простой способ сделать это - иметь яркие биты в выделенном селекторе, с выбранным = true. Таким образом он будет автоматически отображаться, и вам не нужно беспокоиться о том, чтобы скрывать и показывать виды.