2016-08-18 2 views
0

Я новичок в программировании для Android, и у меня есть проблема. Это мой первый вопрос о stackoverflow, поэтому я надеюсь, что я не ошибаюсь в этом.Android Studio ArrayAdapter требует, чтобы идентификатор ресурса был TextView

public class CustomAdapter extends ArrayAdapter<Loger> { 

     Context context; 
     private ArrayList<Loger> logs; 
     private LayoutInflater mInflater; 
     private boolean mNotifyOnChange = true; 
     private URL url; 
     private Bitmap bitmap; 
     private Drawable drawable; 


     public CustomAdapter(Context context, ArrayList<Loger> listLoger) { 
      super(context, R.layout.liesviewlayout); 
      this.context = context; 
      this.logs = new ArrayList<Loger>(listLoger); 
      this.mInflater = LayoutInflater.from(context); 
     } 

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

     @Override 
     public Loger getItem(int position) { 
      return logs.get(position); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     @Override 
     public int getPosition(Loger item) { 
      return logs.indexOf(item); 
     } 

     @Override 
     public int getViewTypeCount() { 
      return 1; //Number of types + 1 !!!!!!!! 
     } 

     @Override 
     public int getItemViewType(int position) { 
      return 1; 
     } 


     public View getView(final int position, View convertView, ViewGroup parent, final Context context) { 
      final ViewHolder holder; 
      int type = getItemViewType(position); 

      if (convertView == null) { 
       holder = new ViewHolder(); 
       switch (type) { 
        case 1: 

         convertView = mInflater.inflate(R.layout.liesviewlayout,parent, false); 

         holder.name = (TextView) convertView.findViewById(R.id.name); 
         holder.comment = (TextView) convertView.findViewById(R.id.comment); 
         break; 
       } 
       convertView.setTag(holder); 
      } else { 
       holder = (ViewHolder) convertView.getTag(); 
      } 

      Thread thread = new Thread(new Runnable() 
      { 
       @Override 
       public void run() 
       { 
        try 
        { 
         url = new URL(logs.get(position).getImageUrl()); 
         Log.d("MyTag", url.toString()); 
         InputStream inputstream_ = (InputStream) new URL(logs.get(position).getImageUrl()).getContent(); 
         //bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream()); 

         drawable = Drawable.createFromStream(inputstream_, "src"); 

         //holder.icon.setImageDrawable(drawable); 
         holder.icon.setImageDrawable(context.getResources().getDrawable(R.drawable.ned_flanders2)); 

         holder.name.setText(logs.get(position).getFirstname()); 
         //+ logs.get(position).getLastname() + logs.get(position).getLocation() + logs.get(position).getTime() + logs.get(position).getStatus()); 
         holder.comment.setText(logs.get(position).getComment()); 
         holder.pos = position; 
        } 
        catch (Exception e) 
        { 
         e.printStackTrace(); 
        } 
       } 
      }); 

      thread.start(); 

      return convertView; 
     } 

     @Override 
     public void notifyDataSetChanged() { 
      super.notifyDataSetChanged(); 
      mNotifyOnChange = true; 
     } 

     public void setNotifyOnChange(boolean notifyOnChange) { 
      mNotifyOnChange = notifyOnChange; 
     } 


     //---------------static views for each row-----------// 
     static class ViewHolder { 

      TextView name; 
      TextView comment; 
      ImageView icon; 
      int pos; //to store the position of the item within the list 
     } 
} 

И мой класс макет:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="?android:attr/listPreferredItemHeight" 

    android:padding="6dip"> 

    <ImageView 

     android:id="@+id/simge" 
     android:layout_width="75dp" 
     android:layout_height="100dp" 
     android:layout_alignParentTop="true" 
     android:layout_alignParentBottom="true" 
     android:layout_marginRight="6dip" 
     android:src="@drawable/pusulalogo" /> 

    <TextView 
     android:id="@+id/comment" 
     android:layout_width="500dp" 
     android:layout_height="30dip" 
     android:layout_toRightOf="@id/simge" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentRight="false" 
     android:singleLine="true" 
     /> 

    <TextView 
     android:id="@+id/name" 
     android:layout_width="500dp" 
     android:layout_height="50dp" 
     android:layout_toRightOf="@id/simge" 
     android:layout_alignParentRight="false" 
     android:layout_alignParentTop="true" 
     android:layout_above="@id/comment" 
     android:layout_alignWithParentIfMissing="true" 
     android:gravity="center_vertical" /> 

</RelativeLayout> 

в моей основной деятельности я заселить свою ArrayList, а затем

lv = (ListView) findViewById(R.id.listView); 

     this.mAdapter = new CustomAdapter(this, listLoger); 
     lv.setAdapter(mAdapter); 

мой класс Loger

public class Loger { 
    public String ImageUrl; 
    public String Firstname; 
    public String Lastname; 
    public String Location; 
    public String Time; 
    public String Status; 
    public String Comment; 

    public String getComment() { 
     return Comment; 
    } 

    public void setComment(String comment) { 
     Comment = comment; 
    } 

    public Loger(String imageUrl, String location, String lastname, String firstname, String time, String status, String comment) { 
     ImageUrl = imageUrl; 
     Location = location; 
     Lastname = lastname; 
     Firstname = firstname; 
     Time = time; 
     Status = status; 
     Comment = comment; 
    } 


    public String getImageUrl() { 
     return ImageUrl; 
    } 

    public void setImageUrl(String imageUrl) { 
     ImageUrl = imageUrl; 
    } 

    public String getFirstname() { 
     return Firstname; 
    } 

    public void setFirstname(String firstname) { 
     Firstname = firstname; 
    } 

    public String getLastname() { 
     return Lastname; 
    } 

    public void setLastname(String lastname) { 
     Lastname = lastname; 
    } 

    public String getLocation() { 
     return Location; 
    } 

    public void setLocation(String location) { 
     Location = location; 
    } 

    public String getTime() { 
     return Time; 
    } 

    public void setTime(String time) { 
     Time = time; 
    } 

    public String getStatus() { 
     return Status; 
    } 

    public void setStatus(String status) { 
     Status = status; 
    } 

я получаю следующее авария

PID: 2370 ArrayAdapter требует идентификатор ресурса быть TextView Вызванный android.widget.RelativeLayout не может быть приведен к android.widget.TextView

ответ

1

попробовать: в основной деятельности передать идентификатор макета XML в то время инициализации адаптера массива т.е. this.mAdapter = новый CustomAdapter (это, R.id., listLoger);

Также проверьте свой пользовательский класс адаптера, текстовое представление и изображение, которое было инициализировано.

+0

@ TR4Android Я меняю свой код, как это, но это не имело никакого значения. По-прежнему получается такая же ошибка. 'this.mAdapter = новый CustomAdapter (это, listLoger, R.id.name); lv = (ListView) findViewById (R.id.listView); если (lv! = Null) { lv.setAdapter (mAdapter); } ' – Balik

1

Исключение довольно толковый само по себе, но это, вероятно, лучше иметь немного знаний о внутренностях, чтобы лучше понять проблему.

Официальная документация ArrayAdapter - это всегда хорошее место для начала. Вы выбрали first constructor со следующей запиской:

int resource: Ресурс идентификатор файла макета, содержащего TextView использовать при инстанцировании взглядов.

Как уже упоминалось, конструктор предполагает, что макет содержит только один TextView, что не подходит для вашего макета. Тем не менее, короткий взгляд на документации приведет вас к following constructor:

ArrayAdapter(Context context, int resource, int textViewResourceId)

0

Хорошо, я удалил свой класс адаптера и переписал его. Вы были правы насчет остатков. Я добавляю это, если кому-то это нужно.

public class CustomAdapter extends BaseAdapter { 

private Activity activity; 
private ArrayList<Loger> logs; 
private static LayoutInflater inflater=null; 
public Resources res; 
Loger tempValues=null; 
int i=0; 
private URL url; 


public CustomAdapter(Activity a, ArrayList<Loger> listLoger,Resources resLocal) { 

    activity = a; 
    logs=listLoger; 
    res = resLocal; 

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

} 

public int getCount() { 

    if(logs.size()<=0) 
     return 1; 
    return logs.size(); 
} 

public Object getItem(int position) { 
    return position; 
} 

public long getItemId(int position) { 
    return position; 
} 

public static class ViewHolder{ 

    public TextView text; 
    public TextView text1; 
    public TextView textWide; 
    public ImageView image; 

} 

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

    View vi = convertView; 
    ViewHolder holder; 

    if(convertView==null){ 

     vi = inflater.inflate(R.layout.liesviewlayout, null); 

     holder = new ViewHolder(); 
     holder.text = (TextView) vi.findViewById(R.id.name); 
     holder.text1=(TextView)vi.findViewById(R.id.comment); 
     holder.image=(ImageView)vi.findViewById(R.id.image); 

     vi.setTag(holder); 
    } 
    else 
     holder=(ViewHolder)vi.getTag(); 

    if(logs.size()<=0) 
    { 
     holder.text.setText("No Data"); 

    } 
    else 
    { 

     tempValues=null; 
     tempValues = (Loger) logs.get(position); 



     holder.text.setText(tempValues.getFirstname()); 
     holder.text1.setText(tempValues.getImageUrl()); 
     holder.image.setImageResource(
       res.getIdentifier(
         "com.androidexample.customlistview:drawable/"+tempValues.getImageUrl() 
         ,null,null)); 

    } 
    return vi; 
} 

} 

и в основной деятельности

Resources res =getResources(); 
     lv = (ListView)findViewById(R.id.listView); 

     //Create Custom Adapter 
     mAdapter=new CustomAdapter(this, listLoger,res); 
     lv.setAdapter(mAdapter); 

Спасибо за ваши ответы, ребята.

Смежные вопросы