2015-02-09 135 views
2

我不會遇到什麼問題。沒有任何錯誤,程序 完美工作。但是,當我點擊列表中的項目時,它不會執行任何操作。在其他詞 「吐司」 將不會通過在Android Studio中使用自定義適配器的自定義ListView

這我主類:

public class ViewListAct extends ActionBarActivity { 


private ListView list; 
private final String[] names_1 = {"McDonald's", "Subway", "Pizza Hut", "Burger King"}; 
private final String[] img_1 = {"mcd", "mcd", "mcd", "mcd"}; 
private Activity context; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.view_list); 
    list = (ListView) findViewById(R.id.listview); 

    AdapterView adapter = new AdapterView(this, img_1, names_1); 
    list.setAdapter(adapter); 


     list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(android.widget.AdapterView<?> parent, View view, int position, long id) { 
      Toast.makeText(getApplicationContext(), names_1[position], Toast.LENGTH_LONG).show(); 


     } 
    }); 

} 

這是我的自定義適配器類:

public class AdapterView extends ArrayAdapter<String> { 

    private Activity context_1; 
    private String[] names_1; 
    private String[] img_1; 

public AdapterView(Activity context, String[] img, String[] names) { 
    super(context, R.layout.pic_letf_tv_right, names); 

    context_1 = context; 
    this.names_1 = names; 
    this.img_1 = img; 
} 

public View getView(int position, View view, ViewGroup parent){ 
    LayoutInflater l_i_f = context_1.getLayoutInflater(); 
    View rv = l_i_f.inflate(R.layout.pic_letf_tv_right, null); 

    TextView tv_l = (TextView) rv.findViewById(R.id.tv_view); 
    tv_l.setText(names_1[position]); 

    ImageView imageView = (ImageView) rv.findViewById(R.id.log_img); 
    int id = context_1.getResources().getIdentifier(img_1[position], "drawable", context_1.getPackageName()); 
    imageView.setImageResource(id); 

    return rv; 
} 

}

這是我的自定義XML行文件:

<?xml version="1.0" encoding="utf-8"?> 
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" android:layout_height="match_parent" 
    android:clickable="true" 
    android:orientation="horizontal" 
    > 

    <ImageView 
    android:layout_width="500px" 
    android:layout_height="500px" 
    android:id="@+id/log_img" 
    /> 

    <TextView 
    android:id="@+id/tv_view" 
    android:layout_gravity="center" 
    android:gravity="center" 
    android:layout_width="match_parent" 
    android:layout_height="500px" 
    android:textColor="#FFFFFF" 
    android:textSize="18dp"/> 
    </LinearLayout> 

這是我的ListView XML文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:overScrollMode="always" 
tools:context=".ViewList"> 



<ListView 
    android:id="@+id/listview" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scrollingCache="false" 
    android:smoothScrollbar="true" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:background="#000000" /> 

誰能告訴我什麼我做錯了。

+2

決不要和wrap_content.this質疑 – 2015-02-09 09:11:36

+0

檢查這個例子是沒有關係的列表視圖,它可以幫助: http://www.mkyong.com/android/android-listview-example/ – Sayem 2015-02-09 09:13:13

+1

嘗試使用ViewListAct.this而不是getApplicationContext() – 2015-02-09 09:13:21

回答

4

首先使用ViewHolder模式。第二延伸BaseAdapter而不是AdapterView。第三個從row.xml刪除android:clickable="true"。可點擊的狀態在方法onItemClickListener中必須有ListView,而不是自己的行。

更新

對於自定義列表視圖,您可以使用BaseAdapter。

,並與適配器類,你就掌握一些小技巧,使其平滑,對於您可以參考this

它也即將resusability已經創建行的控制instances.For是ViewHolder模式我比較喜歡用持有的對象。請檢查this以獲取更多詳細信息

適配器的getView方法的代碼中缺少哪一項。

有關更多說明,請在Adapter的getView方法中留言。

如果您正在使用命名約定應該是正確的 這裏首先名稱是「對象」,這是錯誤的類保存細節。

活動

private ListView list; 
    private final ArrayList<RestaurantsDetails> pairs = new ArrayList<RestaurantsDetails>(); 
    private Activity context; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.activity_main); 

     pairs.add(new RestaurantsDetails("McDonald's", "mcd")); 
     pairs.add(new RestaurantsDetails("Subway", "mcd")); 
     pairs.add(new RestaurantsDetails("Pizza Hut", "mcd")); 
     pairs.add(new RestaurantsDetails("Burger King", "mcd")); 

     list = (ListView) findViewById(R.id.listview); 

     AdapterViewCustom adapter = new AdapterViewCustom(this, pairs); 
     list.setAdapter(adapter); 

     list.setOnItemClickListener(new android.widget.AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(android.widget.AdapterView<?> parent, 
        View view, int position, long id) { 
       Toast.makeText(getApplicationContext(), 
         pairs.get(position).name, Toast.LENGTH_LONG).show(); 
      } 
     }); 

    } 

數據層類

/** 
    * Use proper name For the class. Should not use the name like "Object" or 
    * the class which is already used by framework 
    * 
    */ 
    public class RestaurantsDetails { 

     public String name; 
     public String img; 

     public RestaurantsDetails(String name, String img) { 
      this.name = name; 
      this.img = img; 
     } 

    } 

適配器

public class AdapterViewCustom extends BaseAdapter { 

     private Activity context_1; 

     private ArrayList<RestaurantsDetails> pairs; 

     public AdapterViewCustom(Activity context, 
       ArrayList<RestaurantsDetails> pairs) { 
      context_1 = context; 
      this.pairs = pairs; 
     } 

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

     @Override 
     public Object getItem(int position) { 
      return null; 
     } 

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

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder viewHolder = null; 

      if (convertView == null) { 
       convertView = LayoutInflater.from(context_1).inflate(
         R.layout.custom_row, null); 
       viewHolder = new ViewHolder(); 
       viewHolder.img = (ImageView) convertView 
         .findViewById(R.id.log_img); 
       viewHolder.txt = (TextView) convertView 
         .findViewById(R.id.tv_view); 
       /** 
       * At very first time when the List View row Item control's 
       * instance is created it will be store in the convertView as a 
       * ViewHolder Class object for the reusability purpose 
       **/ 
       convertView.setTag(viewHolder); 
      } else { 
       /** 
       * Once the instance of the row item's control it will use from 
       * already created controls which are stored in convertView as a 
       * ViewHolder Instance 
       * */ 
       viewHolder = (ViewHolder) convertView.getTag(); 
      } 

      viewHolder.txt.setText(pairs.get(position).name); 
      int id = context_1.getResources().getIdentifier(
        pairs.get(position).img, "drawable", 
        context_1.getPackageName()); 
      viewHolder.img.setImageResource(id); 

      return convertView; 
     } 

     public class ViewHolder { 
      public final ImageView img; 
      public final TextView txt; 

     } 
    }