如何让ListAdapter接受所有点击?

时间:2014-02-02 20:49:44

标签: java android listview listadapter

在java中开发android应用程序时,我有一个mainActivity,它以下列方式设置列表适配器:

private void refreshDisplay() 
{
adapter = new ItemAdapter(this, R.layout.listview_item_row, myList);
setListAdapter(adapter);
}

当通过用户输入更改组成列表的数据并在完成编辑活动后返回mainactivity时,将调用此方法refreshDisplay。

列表本身由MainActivity.xml文件中的ListView组成,该文件加载list_item_row_layout,因此:

<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>

并在list_item_row.xml

<RelativeLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" 
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView
    android:id="@+id/TitleText"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:clickable="true"/>

<TextView
    android:id="@+id/DetailText"
    android:layout_width="wrap_content"
    android:layout_height="fill_parent"
    android:clickable="true" />
</RelativeLayout>

在列表适配器中:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    myHolder holder;

    if(row == null)
    {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new itemHolder();
        holder.titleText = (TextView)row.findViewById(R.id.TitleText);
    holder.textDetail = (TextView)row.findViewById(R.id.DetailText);
        row.setTag(holder);
    }
    else
    {
        holder = (myHolder)row.getTag();
    }
    myItem = data.get(position);
    holder.titleText.setText(myItem.getText());
    holder.textDetail.setText(myItem.getDetail());
    if (holder.textDetail.getVisibility()==0) {
        holder.titleText.setVisibility(8);
        holder.textDetail.setVisibility(0);
    }
    else if (holder.titleText.getVisibility()>0) {
        holder.textDetail.setVisibility(8);
        holder.titleText.setVisibility(0);
    }
    else {
        holder.titleText.setVisibility(0);
        holder.textDetail.setVisibility(8);
    }
    return row;
}

生成列表时,它显示没有问题,甚至可以正确运行,只要接受第一次点击,它应该将TitleText扩展为更详细的DetailText。所以DetailText以GONE的Visibility开头,TitleText设置为VISIBLE。如果用户单击listitem,则它会成功切换到DetailText字段。但是当再次单击相同的项目时会出现问题 - TitleText字段不会替换详细版本。我最初认为DetailText是不可点击的 - 但现在让我感到困惑的是,如果点击其他列表项之一,则原始展开的项目将恢复为标题,并且点击的项目会正确扩展!但是如何才能使扩展列表项可以缩小为标题文本而不扩展另一个列表项?是否有一些问题意味着代码中设置为VISIBLE的列表项不能再设置为GONE或INVISIBLE?

1 个答案:

答案 0 :(得分:0)

最后不得不使用一点点黑客,因为接近我可用头发的末端要撕掉哈哈。

由于还原显示标题的所有待办事项也是第一次创建活动时出现的方式 - 我将以下代码放在第二次单击发生的位置。

在我的HTC One上显示之前有一点暂停,如果它是一个可接受的解决方案,我在较慢的手机上进行测试还有待观察。

Intent intentstart = new Intent(MainActivity.this, MainActivity.class); 

intentstart.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intentstart);