2015-02-09 3 views
1

Я пытаюсь перечислить данные, используя новый просмотр Recycler. Я следил за этим tutorial & теперь столкнулся с проблемой в какой-то момент.android.widget.LinearLayout не может быть добавлен в android.widget.TextView в RecyclerView?

Вот мой

MainActivity.java

package com.example.i.newworkspace; 

import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.TextView; 


public class MainActivity extends ActionBarActivity { 

TextView tv; 
RecyclerView recyclerView; 
RecyclerView.Adapter mAdapter; 
String[] myDataset = {"One","Two","Three","Four","Five"}; 

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

    recyclerView = (RecyclerView) findViewById(R.id.recyclerview); 
    recyclerView.setLayoutManager(new LinearLayoutManager(this)); 
    recyclerView.setHasFixedSize(true); 
    mAdapter = new MyAdapter(myDataset); 
    recyclerView.setAdapter(mAdapter); 

} 


@Override 
public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.menu_main, menu); 
    return true; 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 
    // Handle action bar item clicks here. The action bar will 
    // automatically handle clicks on the Home/Up button, so long 
    // as you specify a parent activity in AndroidManifest.xml. 
    int id = item.getItemId(); 

    //noinspection SimplifiableIfStatement 
    if (id == R.id.action_settings) { 
     return true; 
    } 

    return super.onOptionsItemSelected(item); 
} 

} 
class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> 

{ 
    String[] mDataset; 

    public static class ViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTextView; 
     public ViewHolder(TextView v) { 
      super(v); 
      mTextView = v; 
     } 
    } 

    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.my_text_view, null, false); 
     ViewHolder vh = new ViewHolder((TextView) v); 
     return vh; 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 

     holder.mTextView.setText(mDataset[position]); 

    } 

    @Override 
    public int getItemCount() { 
     return mDataset.length; 
    } 

    MyAdapter(String[] myDataset) { 
     mDataset = myDataset; 
    } 
} 

activity_main.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:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity"> 

    <android.support.v7.widget.RecyclerView 

     android:id="@+id/recyclerview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 

    </android.support.v7.widget.RecyclerView> 

</RelativeLayout> 

my_text_view.xml

<?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"> 

    <TextView 
     android:id="@+id/textView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

Logcat:

java.lang.ClassCastException: android.widget.LinearLayout cannot be cast to android.widget.TextView 
       at com.example.i.newworkspace.MyAdapter.onCreateViewHolder(MainActivity.java:78) 
       at com.example.i.nuewworkspace.MyAdapter.onCreateViewHolder(MainActivity.java:59) 

Линия 78:

 ViewHolder vh = new ViewHolder((TextView) v); 
+0

очистить свой проект и попробовать еще раз .. –

+0

@MurtazaHussain Я попробовал. Но, все та же ошибка. – user3289108

ответ

5

Вы должны заметить, что ваш my_text_view.xml является LinearLayout так:

public static class ViewHolder extends RecyclerView.ViewHolder { 

    public TextView mTextView; 
    public ViewHolder(View v) { 
     super(v); 
     // Find the TextView in the LinearLayout 
     mTextView = v.findViewById(R.id.textView)); 
    } 
} 

@Override 
public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

    View v = LayoutInflater.from(parent.getContext()) 
      .inflate(R.layout.my_text_view, parent, false); 
    // Give the view as it is 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 
+0

Спасибо, это сработало. – user3289108

+0

Эй, @ Gorcyn, он отображает данные, но не в виде списка, как в старом формате. Я имею в виду не делитель и все. Как мне это сделать? – user3289108

+0

@ user3289108 Ответ на этот вопрос, который должен помочь: http://stackoverflow.com/questions/24618829/how-to-add-dividers-and-spaces-between-items-in-recyclerview ;) – Gorcyn

1

Вы пытаетесь бросить LinearLayout к TextView.

Изменить эту строку:

ViewHolder vh = new ViewHolder((TextView) v);

к:

ViewHolder vh = new ViewHolder((TextView) v.findViewById(R.id.textView));

+0

ViewHolder здесь, чтобы поддерживать ссылки на соответствующие виды, поэтому мы всегда должны давать ему «корневое» представление, чтобы он мог найти то, что ему нужно. – Gorcyn

+0

Спасибо, я не знал, что это будет работать. Но я предпочитаю отправлять корневое представление как paramater. Добавлен +1 для справки :) – user3289108

+0

@Gorcyn вы правы! я забыл о корневом представлении --- user3289108 спасибо :) – Rami

1

Напыщенный вид содержит корневой элемент тоже, поэтому и нужно создать TextView по findviewbyid функции, а затем передать его в конструктор ViewHolder

@Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View v = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.my_text_view, null, false); 
     TextView tv=(TextView)v.findViewById(R.id.textView); 
     ViewHolder vh = new ViewHolder(tv); 
     return vh; 
    } 

Good Luck