Reputation: 3761
I'm trying to create a ListFragment
.
Each row in the list contains an image and text. Much like this.
I am following the approach of implementing the view using ArrayAdapter
.
But I'm getting NullPointerException @ LayoutInflater inflater = fragmentContext.getLayoutInflater(null);
inside getView() of ArrayAdapter
Code :
ArrayAdapter Class:
public class MyListAdapter extends ArrayAdapter {
Context context;
String[] items;
Fragment fragmentContext;
public MyListAdapter(Context c, int textViewResourceId, String[] listItmes,
Fragment fragmentContext) {
super(c, textViewResourceId, listItmes);
this.items = listItmes;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
LayoutInflater inflater = fragmentContext.getLayoutInflater(null);
view.inflate(context, R.layout.my_row, null);
}
if (items != null) {
TextView tv_my_list_item_title = (TextView) view
.findViewById(R.id.tv_my_list_item_title);
if (tv_my_list_item_title != null) {
tv_my_list_item_title.setText(items[position]);
}
}
return view;
}
}
ListFragment:
public class MyFragment extends ListFragment {
int mCurCheckPosition = 0;
String[] listItems = null;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.mylayout, null);
listItems = getResources().getStringArray(R.array.my_element_list);
return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
// Populate list with our static array of titles.
//ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
// android.R.layout.simple_list_item_1, listItems);
MyListAdapter adapter = new MyListAdapter(getActivity(), R.layout.my_row, listItems, this);
setListAdapter(adapter);
if (savedInstanceState != null) { // Restore last state for checked position.
mCurCheckPosition = savedInstanceState.getInt("curChoice", 0);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putInt("curChoice", mCurCheckPosition);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
showDetails(position);
}
private void showDetails(int position) {
mCurCheckPosition = position;
Toast.makeText(getActivity(), listItems[position], Toast.LENGTH_SHORT).show();
}
}
mylayout:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/android:list"
android:layout_width="match_parent"
android:layout_height="match_parent" >
</ListView>
</LinearLayout>
my_row:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:orientation="vertical"
android:padding="6dp" >
<ImageView
android:id="@+id/iv_mehr_list_item_icon"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:layout_marginRight="6dp"
android:src="@drawable/ic_launcher" />
<TextView
android:id="@+id/tv_mehr_list_item_title"
android:layout_width="fill_parent"
android:layout_height="0dp"
android:gravity="center_vertical" />
</LinearLayout>
Upvotes: 0
Views: 3919
Reputation: 133560
Use the below
LayoutInflater inflater ;
public MyListAdapter(Context c, int textViewResourceId, String[] listItmes,
Fragment fragmentContext) {
super(c, textViewResourceId, listItmes);
this.items = listItmes;
inflater = LayoutInfalter.from(c);
}
And in getView()
use
view = inflater.inflate(R.layout.my_row,parent, false);
There is no need to initialize inflater in getView
. You need to intialize the inflated view to view
coz you have View view = convertView
and then use the inlfated view object to initialize your textview.
Edit:
Also i would suggest you use a view holder pattern
http://developer.android.com/training/improving-layouts/smooth-scrolling.html
Upvotes: 10
Reputation: 21805
Context context;
String[] items;
Fragment fragmentContext;
public MyListAdapter(Context c, int textViewResourceId, String[] listItmes,
Fragment fragmentContext) {
super(c, textViewResourceId, listItmes);
this.items = listItmes;
}
}
you are not assigning the context passed to fragmentContext
inside the constructor.. so it remains null
add inside the constructor
this.fragmentContext = fragmentContext;
Upvotes: 2