2016-04-24 12 views
0

私はアプリケーションを構築していますが、XMLファイルに定義された項目のListViewを設定しようとしていました。それほど難しいとは思っていませんでしたが、私は非常に奇妙な問題に遭遇しましたが(私はこれを理解したことはありませんでした)、これを解決する方法はわかりませんが、フォーラムとネットでも、 。ここに私のコードと結果を私の携帯電話に載せるつもりですが、言い換えれば、私のアプリはアイテムのリストを作成して要素を設定しているということです...しかし、起動すると、右のテキストが設定された最初の項目を見るだけで、他の要素のテキストはすべて設定されません。私が画面をスクロールしてからそれを元に戻すと...魔法が起こります!すべてのテキストはよく設定されています!私のアプリが冗談を言っているのですか、コードに本当の誤りがありますか?ListViewがアプリケーションのテキストを変更していません

activity_list.xml

<?xml version="1.0" encoding="utf-8"?> 
<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:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context="com.example.mancu_000.onclickmarkerlistener.ListActivity"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/listview" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" /> 
</RelativeLayout> 

ListActivity.java

package com.example.mancu_000.onclickmarkerlistener; 

import android.content.Context; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 

import java.util.ArrayList; 
import java.util.List; 

public class ListActivity extends AppCompatActivity { 

    private ArrayList<String> data = new ArrayList<String>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list); 
     ListView lv = (ListView) findViewById(R.id.listview); 
     generateListContent(); 
     lv.setAdapter(new MyListAdapter(this, R.layout.list_layout, data)); 
    } 

    private void generateListContent() { 
     int i = 0; 
     do { 
      data.add("This is the element number " + i); 
      i++; 
     } while (i < 55); 
    } 

    private class MyListAdapter extends ArrayAdapter<String> { 

     private int layout; 

     public MyListAdapter(Context context, int resource, List<String> objects) { 
      super(context, resource, objects); 
      layout = resource; 
     } 

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

      ViewHolder mainViewHolder = null; 

      if(convertView == null) { 
       LayoutInflater inflater = LayoutInflater.from(getContext()); 
       convertView = inflater.inflate(layout, parent, false); 
       ViewHolder viewHolder = new ViewHolder(); 
       viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
       viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
       viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 
       viewHolder.button.setOnClickListener(new View.OnClickListener() { 
        @Override 
        public void onClick(View v) { 
         Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
        } 
       }); 
       convertView.setTag(viewHolder); 
      } 
      else { 
       mainViewHolder = (ViewHolder) convertView.getTag(); 
       mainViewHolder.title.setText(getItem(position)); 
      } 

      return convertView; 
     } 
    } 

    public class ViewHolder { 
     ImageView thumbnail; 
     TextView title; 
     Button button; 
    } 
} 

list_layout.xml

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

    <ImageView 
     android:layout_width="65dp" 
     android:layout_height="65dp" 
     android:id="@+id/list_item_thumbnail" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentStart="true" 
     android:src="@mipmap/ic_launcher" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="New Text" 
     android:id="@+id/list_item_text" 
     android:layout_toEndOf="@+id/list_item_thumbnail" /> 

    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Okay" 
     android:id="@+id/list_item_btn" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentEnd="true" /> 
</RelativeLayout> 

S私はこの活動を開始したときに、O、これは画面上で起こるものです: First image

だから、私は、画面を下にスクロールして、再びそれをスクロールアップ...そして、ここに魔法です:Second image

してください助けてください、私はこの日から私の心を吹き飛ばしています!!

答えて

0

convertViewがnullの場合にテキストを設定しないため、ListViewの項目にはデフォルトのテキストがあります。 Buttonをクリックしたときに生成されたToastも、メッセージを更新しないため正しくない可能性があります。

あなたはこのようにコードを変更する必要があります。

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

    ViewHolder mainViewHolder = null; 

    if (convertView == null) { 
     LayoutInflater inflater = LayoutInflater.from(getContext()); 
     convertView = inflater.inflate(layout, parent, false); 
     mainViewHolder = new ViewHolder(); 
     mainViewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
     mainViewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
     mainViewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 

     convertView.setTag(mainViewHolder); 
    } else { 
     mainViewHolder = (ViewHolder) convertView.getTag(); 
    } 

    mainViewHolder.title.setText(getItem(position)); 
    mainViewHolder.button.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
     } 
    }); 

    return convertView; 
} 
+0

おかげで、これは完璧な作業です!あなたの助けを本当に感謝し、あなたは私の一日を作った! – Davide

0

だけで、次のコードで、あなたのGetViewメソッドを置き換えます。間違いなく動作します

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

     ViewHolder viewHolder = null; 

     if(convertView == null) { 
      LayoutInflater inflater = LayoutInflater.from(getContext()); 
      convertView = inflater.inflate(layout, parent, false); 
      viewHolder = new ViewHolder(); 
      viewHolder.thumbnail = (ImageView) convertView.findViewById(R.id.list_item_thumbnail); 
      viewHolder.title = (TextView) convertView.findViewById(R.id.list_item_text); 
      viewHolder.button = (Button) convertView.findViewById(R.id.list_item_btn); 

      convertView.setTag(viewHolder); 
     } 
     else { 
      viewHolder = (ViewHolder) convertView.getTag(); 

     } 

     viewHolder.title.setText(getItem(position)); 

     viewHolder.button.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Toast.makeText(getContext(), "Button clicked for list item " + position, Toast.LENGTH_SHORT).show(); 
      } 
     }); 

     return convertView; 
    } 
+0

おかげで、これは完璧な作業です!あなたの助けを本当に感謝し、あなたは私の一日を作った!残念ながら、私は緑の旗で答えを1つしか設定できませんが、あなたのものは他のものと同じです。もし可能であればあなたの上に緑を置くでしょう。 – Davide

関連する問題