【问题标题】:Item element can not be accessed on my list view无法在我的列表视图中访问项目元素
【发布时间】:2015-11-21 19:36:29
【问题描述】:

我有一个 ListView,其中有一些主题。当我按下项目(主题)时,我无法访问 My AssignaturaActivity 视图。 我正在使用 setOnItemClickListener 来抛出活动,但它没有响应。

我做了我自己的适配器和我自己的项目布局,所以列表已显示,我可以将新主题添加到列表中,刷新它,但我无法访问项目列表... 这是我的一些代码:

public class AssignaturesActivity extends AppCompatActivity {


private ListView llistaAssignatures;
private ArrayList<Assignatura> Assignatures;

private itemAdapter adapter;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_assignatures);

    llistaAssignatures = (ListView)findViewById(R.id.llistaAssignatures);     


    Assignatures = new ArrayList<Assignatura>();

    Assignatures.add(new Assignatura("Android"));
    Assignatures.add(new Assignatura("COMS"));
    Assignatures.add(new Assignatura("IMQSA"));
    Assignatures.add(new Assignatura("ANALOGICA"));
    Assignatures.add(new Assignatura("ALGORITMIA A/V"));



    adapter = new itemAdapter(this, R.layout.item, Assignatures);


    llistaAssignatures.setAdapter(adapter);

    llistaAssignatures.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Intent i = new Intent(AssignaturesActivity.this, AssignaturaActivity.class);
            i.putExtra("pos", position);
            startActivity(i);
        }
    });

}



private void lanzarAcercade(View view) {
    Intent i = new Intent(this, AcercaDe.class);
    startActivity(i);
}

private void lanzarEditAssignaturaActivity(View view) {

    Intent i = new Intent(this, EditAssignaturaActivity.class);
    startActivityForResult(i, 0);

}
}

知道发生了什么吗? 谢谢!

编辑: 我的 ItemAdapter:

public class itemAdapter extends ArrayAdapter<Assignatura> { // Aprofitem els paramtres de ArrayAdapter (Herencia)

public itemAdapter(Context context,int layout_resource, ArrayList<Assignatura> data) {

    //Cridar al constructor del ArrayAdapter<item> amb super.
    super(context, layout_resource,R.id.nom, data);

}




@Override
public View getView(int position, View convertView, ViewGroup parent) {
    convertView=  super.getView(position, convertView, parent); 

    Assignatura item = getItem(position); //Retorna l'Item que estaba a la posicio "position"


    TextView item_name =  (TextView) convertView.findViewById(R.id.nom); // Busca dins de la pastilleta
    RatingBar estrelles  =(RatingBar) convertView.findViewById(R.id.ratingBar);



    item_name.setText(item.getNomAssignatura().toString());



    return convertView;



}
}

还有我的项目布局:

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

<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Assignatura"
android:id="@+id/nom"
android:textSize="30dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp" />

<RatingBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/ratingBar"
android:layout_marginTop="10dp" />

</LinearLayout>

【问题讨论】:

  • 你想获取什么数据?
  • 您的项目列表行布局如何?
  • @Udi Idan ,现在我正在尝试使用意图启动一个活动(AssignaturesActivity))
  • 你应该使用适配器,发布适配器代码,它会更容易回答
  • @Albeis 请发布您的行项目布局

标签: android listview selecteditem


【解决方案1】:

将 android:descendantFocusability="blocksDescendants" 添加到 LinearLayout 以查看是否有帮助。这应该可以防止 TextView 和 RatingBar 的后代接收焦点。

【讨论】:

    【解决方案2】:

    我认为你应该修改 getView 方法,这样视图就会被回收。 我已使用适配器的上下文将 onClick 侦听器添加到您的 convertView。

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
     LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.your_item_layout,
                    parent, false);
    
            convertView.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
                   Intent i = new Intent(context, AssignaturaActivity.class);
                   i.putExtra("pos", position);
                   context.startActivity(i);
            }
           }); 
    
        }
    
        Assignatura item = getItem(position); //Retorna l'Item que estaba a la posicio "position"
    
        TextView item_name =  (TextView) convertView.findViewById(R.id.nom); // Busca dins de la pastilleta
        RatingBar estrelles  =(RatingBar) convertView.findViewById(R.id.ratingBar);
    
        item_name.setText(item.getNomAssignatura().toString());
        return convertView;
    }
    

    【讨论】:

    • 但是我应该删除 AssignaturesActivity 上的 onClick 监听器,对吗?
    • 是的,如果你采用这种方法,你应该这样做
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 1970-01-01
    相关资源
    最近更新 更多