带有标题视图的Android列表视图无法获得正确的项目位置

时间:2016-02-24 15:03:27

标签: android listview

我的listview有问题。我使用

添加了标题视图
listView.addHeaderView(header, null, false);

它正在工作。我使用它来防止在列表项中计算标题视图。此标题视图具有展开/折叠图标。因此,最初,标题视图已折叠,并且只能通过省略号查看截断的文本。单击展开图标时,它应该展开(我已经编码了展开/折叠动画)。

这是我尝试过的:

MainActivity

episodesAdapter = new CustomAdapter(this, this, itemList);
listView.setAdapter(episodesAdapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void   onItemClick(AdapterView<?> parent, View view, int position, long id) {

if (commentView.getVisibility() == View.GONE) {
episodesAdapter.setItemSelected(position);
Log.e(TAG, "LV POS: " + position);
TextView title = (TextView) view.findViewById(R.id.tvListTitle);
TextView details = (TextView) view.findViewById(R.id.tvDetails);
setDetails(title.getText().toString(), details.getText().toString());

} });

列表中的选定项目显示在标题视图中(详细信息)。

CustomAdapter

@Override
public int getCount() {
    return data.size();
}

@Override
public HashMap<String, String> getItem(int position) {

    if(data.get(position) != null) {
        return data.get(position);
    } else {
        return null;
    }

}

@Override
public long getItemId(int position) {
    return 0;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {

    final ViewHolder viewHolder;

    try {
        if (convertView == null) {

            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            convertView = inflater.inflate(R.layout.list_video_item, parent, false);
            viewHolder = new ViewHolder(); 
            viewHolder.tvTitle = (TextView) convertView.findViewById(R.id.tvTitle);
            viewHolder.tvDetails = (TextView) convertView.findViewById(R.id.tvListDetails);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        result = new HashMap<>();
        result = data.get(position);
        viewHolder.tvTitle.setText(result.get(Constants.TITLE));
     viewHolder.tvDetails.setText(result.get(Constants.DESCRIPTION));

        if(mItemSelected == position){
            convertView.setSelected(true);
            activity.setDetails(result.get(Constants.TITLE), result.get(Constants.DESCRIPTION) );
        }
        else {
            convertView.setSelected(false);
        }


    } catch (Exception e ) {
    }

    return convertView;

}



private int mItemSelected = 0;

public void setItemSelected(int position){
    mItemSelected = position;
}

仅供参考,我将listview设置为SINGLE_CHOICE,以突出显示所选项目。但我得到正确的项目位置有问题,我的第一个项目变为1而不是0.当我展开我的标题视图时,它将所选项目(第一个/默认项目)替换为下一个项目(列表中的第二个项目) )当我折叠我的标题视图时,它会返回到最初选择的项目。这里似乎有什么问题?几个星期以来,我一直坚持这个问题。我无法继续。我真的很感激任何帮助。谢谢!

标题视图:

 <RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent" >

<RelativeLayout
    android:id="@+id/rlHolder"
    android:paddingTop="15dp"
    android:paddingBottom="5dp"
    android:paddingLeft="15dp"
    android:paddingRight="15dp"
    android:background="@color/main_blue"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" >

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp"
        android:textColor="@color/white"
        android:id="@+id/tvTitle"
        android:layout_alignParentStart="true"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/tvDetails"
        android:layout_marginTop="10dp"
        android:textColor="@color/white"
        android:singleLine="true"
        android:ellipsize="end"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <LinearLayout
        android:visibility="gone"
        android:id="@+id/lAdditionalView"
        android:layout_below="@+id/tvDetails"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:text="Cast"
            android:id="@+id/tvCastHolder"
            android:textSize="18sp"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

        <TextView
            android:id="@+id/tvCasts"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

        <TextView
            android:text="Genre"
            android:id="@+id/tvGenreHolder"
            android:textSize="18sp"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

        <TextView
            android:id="@+id/tvGenres"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

        <TextView
            android:text="Views"
            android:id="@+id/tvViewsHolder"
            android:textSize="18sp"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

        <TextView
            android:id="@+id/tvViews"
            android:textColor="@color/white"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginTop="5dp" />

    </LinearLayout>


    <ImageView
        android:id="@+id/ivArrow"
        android:src="@drawable/chatarrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_below="@+id/lAdditionalView"
        android:layout_centerHorizontal="true" />


</RelativeLayout>
</RelativeLayout>

1 个答案:

答案 0 :(得分:0)

使用ListViewaddHeaderView()添加标题视图时,它会根据您添加的标题视图数偏移列表中所有项目的位置。

OnItemClickListenerepisodesAdapter.setItemSelected(position)更改为episodesAdapter.setItemSelected(position - listView.getHeaderViewsCount)。这将更正偏移并将所选位置正确设置为所选视图。