2013-10-11 4 views
0

Я совершенно новый, все андроид/java, и сегодня мне очень тяжело. Я знаю, что есть много вопросов по этому вопросу раньше, но ничего, что я пробовал до сих пор, похоже, работает, и мое приложение продолжает chrashing:/Несколько TextViews, используя пользовательский адаптер Array

То, что я пытаюсь сделать, это заполнить списокView двумя различными текстовыми элементами , в зависимости от того, откуда приходит сообщение. Моя ошибка из LogCat - «вы должны указать идентификатор ресурса для TextView».

Мой код отображается под;

row.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    <TextView 
    android:id="@+id/label_client" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:paddingLeft="5dp" 
    android:textColor="@color/Black" 
    android:background="@drawable/green" 
    android:text="@string/hello_world"> 
    </TextView> 

    <TextView 
    android:id="@+id/label_server" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:textSize="30sp" 
    android:paddingLeft="5dp" 
    android:textColor="@color/Black" 
    android:background="@drawable/yellow" 
    android:text="@string/hello_world"> 
    </TextView> 
    </LinearLayout> 

RowAdapter.java:

public class RowAdapter extends ArrayAdapter<String>{ 
int textViewResourceId; 
private final ArrayList<String> arrayList; 
int sender; 

public RowAdapter(Context context, int textViewResourceId, ArrayList<String> arrayList, int sender){ 
    super(context, R.layout.row, arrayList); 
    this.textViewResourceId = textViewResourceId; 
    this.arrayList = arrayList; 
    this.sender = sender; 
} 

//@Override 
public View getview(int position, View convertView, ViewGroup parent){ 
    View rowView = convertView; 
    if (rowView==null){ 
     LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     rowView = inflater.inflate(textViewResourceId, parent, false); 
     } 

    String s = arrayList.get(position); 

    if(sender==0){ 
     if (s != null) { 
      TextView tt = (TextView) rowView.findViewById(R.id.label_client); 
      if (tt != null){ 
       tt.setText(s); 
       } 
      } 
     } 
    if(sender==1){ 
     if (s != null) { 
      TextView tt = (TextView) rowView.findViewById(R.id.label_server); 
      if (tt != null){ 
       tt.setText(s); 

      } 
     } 

    } 

    return rowView; 
} 

}

Когда я называю его от основной деятельности это делается так:

public class MainActivity extends Activity { 

private ArrayList<String> arrayList = new ArrayList<String>(); 
ListView listView; 

RowAdapter radapter; 

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

     radapter = new RowAdapter(this, R.layout.row, arrayList, sender); 
     listView = (ListView)findViewById(R.id.list); 
     listView.setAdapter(radapter); 


     new Thread(new ClientThread()).start(); 
    } 


    public void onClick(View view) { 
      sender = 0; 
      AddChat(str); 
      radapter.notifyDataSetChanged(); 
      } 


    public void AddChat(String msg){ 
     arrayList.add(msg); 
    } 
     } 

основная.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: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=".MainActivity" > 

    <ListView 
    android:id="@+id/list" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:layout_alignParentBottom="true" 
    android:layout_centerHorizontal="true" 
    android:layout_weight="1" 
    android:drawSelectorOnTop="false" 
    tools:listitem="@layout/row" > 
    </ListView> 

    </RelativeLayout> 

Действительно извините за длинный пост, просто думал, что это было лучше, чтобы дать вам полный информационный фон :)

ответ

0

Пожалуйста, попробуйте BaseAdapter:

public class RowAdapter extends BaseAdapter { 

private Context context; 
private int textViewResourceId; 
private final ArrayList<String> arrayList; 
private int sender; 

public RowAdapter(Context context, int textViewResourceId, 
     ArrayList<String> arrayList, int sender) { 
    super(); 

    this.textViewResourceId = textViewResourceId; 
    this.arrayList = arrayList; 
    this.sender = sender; 
    this.context = context; 
} 

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

    if (convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(textViewResourceId, parent, false); 
    } 

    String s = arrayList.get(position); 

    if (sender == 0) { 
     if (s != null) { 
      TextView tt = (TextView) convertView 
        .findViewById(R.id.label_client); 
      if (tt != null) { 
       tt.setText(s); 
      } 
     } 
    } 
    if (sender == 1) { 
     if (s != null) { 
      TextView tt = (TextView) convertView 
        .findViewById(R.id.label_server); 
      if (tt != null) { 
       tt.setText(s); 
      } 
     } 

    } 
    return convertView; 
} 

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

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

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

Спасибо так много! Это сработало :) – user2870944

+0

Но по какой-то причине переменная «отправитель» не будет установлена. Вы знаете, почему? Его набор beeing, и когда что-то rund forfor getView(), он получает сброс до 0 или false ... – user2870944

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