Android - 更改所选自定义列表项的布局视图

时间:2015-01-08 16:56:46

标签: android android-layout android-listview

我有一个自定义列表视图适配器和2个布局xml文件,一个用于标准视图,另一个是我希望在选择列表项时显示

我希望它能够工作,这样如果我在列表中选择一个项目会显示更多数据,如果我选择另一个项目,之前选择的项目将恢复为默认值,因为在任何给定时间只能选择一个项目

继续我所尝试过的,但它没有按照我的意愿工作,有什么建议吗?

MainActivity.java文件

public class MainActivity extends Activity {
ListView lv;
List<ListViewItem> items;
CustomListViewAdapter adapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    lv = (ListView) findViewById(R.id.listView);
    items  = new ArrayList<MainActivity.ListViewItem>();
    items.add(new ListViewItem()
    {{
        ThumbnailResource = R.drawable.ic_launcher;
        Title = "Item1";
        SubTitle = "Item1 Description";
        Detail1 =" more details";
        Detail2 ="01 123455";
    }});
    items.add(new ListViewItem()
    {{
        ThumbnailResource = R.drawable.ic_launcher;
        Title = "Item2";
        SubTitle = "Item2 Description";
        Detail1 ="additional  details";
        Detail2 ="090 641123";
    }});

    adapter = new CustomListViewAdapter(this, items);
    lv.setAdapter(adapter);
    lv.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

              adapter.selectedItem(position);
              adapter.notifyDataSetChanged();
        }
    });
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_main, menu);
    return true;
}

class ListViewItem
{
    public int ThumbnailResource;
    public String Title;
    public String SubTitle;
    public String Detail1;
    public String Detail2;
}

}

CustomListViewAdapter.java

package com.customlistview;

import java.util.List;

import com.customlistview.MainActivity.ListViewItem;

import android.app.Activity;  
import android.content.Context;
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.ViewGroup;  
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.BaseAdapter;  
import android.widget.ImageView;  
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;  
import android.widget.Toast;

public class CustomListViewAdapter extends BaseAdapter
{  

LayoutInflater inflater;
List<ListViewItem> items;
int position;

public CustomListViewAdapter(Activity context, List<ListViewItem> items) {  
    super();

    this.items = items;
    this.inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}

@Override  
public int getCount() {  
    // TODO Auto-generated method stub  
    return items.size();  
}  

@Override  
public Object getItem(int position) {  
    // TODO Auto-generated method stub  
    return null;  
}  

@Override  
public long getItemId(int position) {  
    // TODO Auto-generated method stub  
    return 0;  
}
public void selectedItem(int position)
{
   this.position = position; //position must be a global variable
}
@Override  
public View getView(final int position, View convertView, ViewGroup parent) {  
    // TODO Auto-generated method stub  


    ListViewItem item = items.get(position);

    View vi=convertView;
    View vi2=convertView;


    if(convertView==null)
        vi = inflater.inflate(R.layout.item_row, null);


    ImageView imgView = (ImageView) vi.findViewById(R.id.imgThumbnail);
    TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle);
    TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle);

    imgView.setImageResource(item.ThumbnailResource);
    txtTitle.setText(item.Title);
    txtSubTitle.setText(item.SubTitle);

    if(this.position == position)
    {
        vi2 = inflater.inflate(R.layout.item_row_selected, null);
        ImageView imgView2 = (ImageView) vi2.findViewById(R.id.imgThumbnail);
        TextView txtTitle2 = (TextView) vi2.findViewById(R.id.txtTitle);
        TextView txtSubTitle2 = (TextView) vi2.findViewById(R.id.txtSubTitle);

        imgView2.setImageResource(item.ThumbnailResource);
        txtTitle2.setText(item.Title);
        txtSubTitle2.setText(item.SubTitle);

        return vi2;
    }
             return vi;  
}



}

选择Xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout   
android:id="@+id/relativeLayout2"   
android:layout_width="fill_parent"   
android:layout_height="fill_parent"   
xmlns:android="http://schemas.android.com/apk/res/android"  
android:padding="5dip">  

<ImageView   
    android:layout_width="78dip"   
    android:layout_height="78dip"   
    android:id="@+id/imgThumbnail"   
    android:layout_alignParentLeft="true"  
    android:layout_centerInParent="true"
    android:layout_marginLeft="-3dip"
    android:scaleType="centerInside">  
</ImageView>  

<TextView   
    android:textAppearance="?android:attr/textAppearanceLarge"   
    android:layout_height="wrap_content"   
    android:text="TextView"   
    android:layout_width="wrap_content"   
    android:id="@+id/txtTitle"   
    android:layout_toRightOf="@+id/imgThumbnail"
    android:layout_marginTop="6dip"  
    android:layout_marginLeft="6dip">  
</TextView>  

<TextView   
    android:layout_height="wrap_content"   
    android:text="TextView"   
    android:layout_width="wrap_content"   
    android:id="@+id/txtSubTitle"   
    android:layout_toRightOf="@+id/imgThumbnail"  
    android:layout_below="@+id/txtTitle"
    android:layout_marginTop="3dip"  
    android:layout_marginLeft="6dip">  
</TextView>

<TextView
    android:id="@+id/txtdet1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignBaseline="@+id/txtSubTitle"
    android:layout_alignBottom="@+id/txtSubTitle"
    android:layout_toRightOf="@+id/txtTitle"
    android:text="TextView" />

<TextView
    android:id="@+id/txtdet2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtSubTitle"
    android:layout_alignRight="@+id/TextView01"
    android:layout_below="@+id/txtSubTitle"
    android:text="TextView" />

<Button
    android:id="@+id/btnaccept"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignRight="@+id/imgThumbnail"
    android:layout_below="@+id/txtdet2"
    android:text="details" />

<Button
    android:id="@+id/btndetails"
    style="?android:attr/buttonStyleSmall"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/txtdet2"
    android:layout_below="@+id/txtdet2"
    android:text="cancel" />

标准布局xml

<?xml version="1.0" encoding="utf-8"?>  
<RelativeLayout   
android:id="@+id/relativeLayout1"   
android:layout_width="fill_parent"   
android:layout_height="fill_parent"   
xmlns:android="http://schemas.android.com/apk/res/android"  
android:padding="5dip">  

<ImageView   
    android:layout_width="78dip"   
    android:layout_height="78dip"   
    android:id="@+id/imgThumbnail"   
    android:layout_alignParentLeft="true"  
    android:layout_centerInParent="true"
    android:layout_marginLeft="-3dip"
    android:scaleType="centerInside">  
</ImageView>  

<TextView   
    android:textAppearance="?android:attr/textAppearanceLarge"   
    android:layout_height="wrap_content"   
    android:text="TextView"   
    android:layout_width="wrap_content"   
    android:id="@+id/txtTitle"   
    android:layout_toRightOf="@+id/imgThumbnail"
    android:layout_marginTop="6dip"  
    android:layout_marginLeft="6dip">  
</TextView>  

<TextView   
    android:layout_height="wrap_content"   
    android:text="TextView"   
    android:layout_width="wrap_content"   
    android:id="@+id/txtSubTitle"   
    android:layout_toRightOf="@+id/imgThumbnail"  
    android:layout_below="@+id/txtTitle"
    android:layout_marginTop="3dip"  
    android:layout_marginLeft="6dip">  
</TextView>

1 个答案:

答案 0 :(得分:0)

我做了simar建议,并在listviewItem中添加了一个标志以切换可见性,然后在点击我想要显示或隐藏的控件的项目时切换此标志

txtdet1.setVisibility( item.Expanded ? View.VISIBLE : View.GONE);