ListView不令人耳目一新

时间:2016-01-25 13:38:14

标签: android listview

我的ListView有问题。我正在创建新对象,并通过单击第一个片段中的按钮将其添加到数据库中。在第二个片段中,我从我的数据库中获得了包含对象的listview。一切正常,但第二个片段中的listView不刷新 - 我只在重新启动应用程序后看到新对象。所有解决方案如:notifyDataSetChanged都不起作用:/

这是我的第一个片段的适配器:

public class ConcertAdapter extendsRecyclerView.Adapter<ConcertAdapter.MyViewHolder> {

private static final String FRAGMENT_TAG = "fragmentTag";
private static final String TAG = ConcertAdapter.class.getSimpleName() ;
private LayoutInflater inflater;
private Context context;
private List<Concert> concertList = new ArrayList<>();
private DatabaseHelper mDatabaseHelper = null;
private int selectedRecordPosition = -1;

private MainActivity mActivity;


public ConcertAdapter(Context context, List<Concert> concerts, MainActivity mainActivity) {
    this.inflater = LayoutInflater.from(context);
    this.concertList = concerts;
    this.context = context;
    this.mActivity = mainActivity;
}

public void setListConcert(ArrayList<Concert> concertList) {
    this.concertList = concertList;
    notifyItemRangeChanged(0, concertList.size());
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

    View view = inflater.from(parent.getContext()).inflate(R.layout.concert_item, parent, false);
    return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
    final float screenWidthPx = holder.itemView.getResources().getDisplayMetrics().widthPixels;
    Concert current = concertList.get(position);
    Log.d("mLog", current.getUrl());
    holder.mImage.setImageUrl(current.getUrl(), MySingleton.getInstance().getImageLoader());
    holder.mImage.getLayoutParams().height = (int) (screenWidthPx * 0.50);
    holder.mFav_btn.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            if(isChecked) {
                final Concert favConcert = new Concert();
                favConcert.setTitle(concertList.get(position).getTitle());
                favConcert.setContent(concertList.get(position).getContent());
                favConcert.setDate(concertList.get(position).getDate());
                favConcert.setUrl(concertList.get(position).getUrl());
                try {
                    final Dao<Concert, Integer> concertDao = getHelper().getConcertDao();
                    concertDao.create(favConcert);

                }catch (SQLException e) {
                    e.printStackTrace();
                }

            }

        }
    });
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    Date concertDate = new Date();
    try {
        concertDate = format.parse(current.getDate());
    } catch (ParseException e) {
        e.printStackTrace();
    }
    DateTime dt = new DateTime();
    DateTime currentDate = dt.withZone(DateTimeZone.forID("Europe/Warsaw"));
    int days = Days.daysBetween(new DateTime(currentDate), new DateTime(concertDate)).getDays();
    String s = String.valueOf(days);
    holder.mDate_btn.setText(s + " dni");
    if (s.equals("0")) {
        holder.mDate_btn.setText("dziś :)");
    }

}

@Override
public int getItemCount() {
    return concertList.size();
}
public void setConcerts(List<Concert> concerts) {
    concertList = new ArrayList<>(concerts);
}

public void showDisplay(int position) {


    Bundle bundle = new Bundle();
    bundle.putInt("position", position);
    bundle.putString("content", concertList.get(position).getContent());
    bundle.putString("date", concertList.get(position).getDate());
    bundle.putString("url", concertList.get(position).getUrl());
    bundle.putString("title", concertList.get(position).getTitle());

    Fragment fragment = new DisplayConcertFragment();
    fragment.setArguments(bundle);
    mActivity.replaceFragment(fragment);

}


class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public NetworkImageView mImage;
    public Button mDate_btn;
    public TextView mBubble;
    public ToggleButton mFav_btn;
    public ImageView mBubbleImage;
    private ConcertFragment mConcertFragment;


    public MyViewHolder(View itemView) {
        super(itemView);
        mImage = (NetworkImageView) itemView.findViewById(R.id.concerts_niv);
        mDate_btn = (Button) itemView.findViewById(R.id.date_btn);
        mImage.setOnClickListener(this);
        mFav_btn = (ToggleButton) itemView.findViewById(R.id.fav_btn);

    }


    @Override
    public void onClick(View v) {
        showDisplay(getAdapterPosition());

        //ft.setCustomAnimations(android.R.animator.fade_in, android.R.animator.fade_out);
        Toast.makeText(context, "TEST", Toast.LENGTH_LONG).show();
    }
    public Concert removeItem(int position) {
        final Concert concert = concertList.remove(position);
        notifyItemRemoved(position);
        return concert;
    }


}
private DatabaseHelper getHelper() {
    if (mDatabaseHelper == null) {
        mDatabaseHelper = OpenHelperManager.getHelper(context,DatabaseHelper.class);
    }
    return mDatabaseHelper;
}

这是我的第二个适配器:

public class FavAdapter extends ArrayAdapter {

    private LayoutInflater mInflater;
    private List mRecords;
    private Dao<Concert, Integer> concertDao;
    private Button mDateButton;
    private NetworkImageView mImage;


    public FavAdapter(Context context, int resource, List objects, Dao<Concert, Integer> concertDao) {
        super(context, resource, objects);
        this.mRecords = objects;
        this.concertDao = concertDao;
        mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }


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



        if(convertView == null)
            convertView = mInflater.inflate(R.layout.concert_item, parent, false);
        if(mRecords.get(position).getClass().isInstance(new Concert())){
            final Concert concert = (Concert) mRecords.get(position);
            mImage =((NetworkImageView)convertView.findViewById(R.id.concerts_niv));
            mImage.setImageUrl(concert.getUrl(), MySingleton.getInstance().getImageLoader());
            final float screenWidthPx = mImage.getResources().getDisplayMetrics().widthPixels;
            mImage.getLayoutParams().height = (int) (screenWidthPx * 0.50);
            mDateButton = (Button) convertView.findViewById(R.id.date_btn);
            Date concertDate = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

            try {
                concertDate = format.parse(concert.getDate());
            } catch (ParseException e) {
                e.printStackTrace();
            }
            DateTime dt = new DateTime();
            DateTime currentDate = dt.withZone(DateTimeZone.forID("Europe/Warsaw"));
            int days = Days.daysBetween(new DateTime(currentDate), new DateTime(concertDate)).getDays();
            String s = String.valueOf(days);
            mDateButton.setText(s + " dni");
            if (s.equals("0")) {
                mDateButton.setText("dziś :)");
            }
           // ((TextView)convertView.findViewById(R.id.teacher_tv)).setText(studentDetails.teacher.teacherName);
        }

        return convertView;
    }
}

这是我使用ListView的第二个片段:

public class FavFragment extends Fragment {

    private static final String TAG = FavFragment.class.getSimpleName() ;
    private DatabaseHelper mDatabaseHelper = null;
    private ListView mListView;
    private int selectedRecordPosition = -1;
    private Dao<Concert, Integer> concertDao;
    private List<Concert> concertList;
    private MainActivity mActivity;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_fav_layout, container, false);
        mListView = (ListView)v.findViewById(R.id.concerts_lv);
        mActivity = (MainActivity) getContext();
        try {
            concertDao =  getHelper().getConcertDao();
            concertList = concertDao.queryForAll();
            FavAdapter adapter = new FavAdapter(getContext(), R.layout.concert_item, concertList, concertDao);
            mListView.setAdapter(adapter);
            adapter.notifyDataSetChanged();
            mListView.invalidateViews();
            mListView.refreshDrawableState();

        } catch (SQLException e) {
            e.printStackTrace();
        }

        Log.e(TAG, "onCreateView notify");
        return v;
    }


    private DatabaseHelper getHelper() {
        if (mDatabaseHelper == null) {
            mDatabaseHelper = OpenHelperManager.getHelper(getContext(), DatabaseHelper.class);
        }
        return mDatabaseHelper;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        if (mDatabaseHelper != null) {
            OpenHelperManager.releaseHelper();
            mDatabaseHelper = null;
        }
    }
}

这是我的第一个片段

public class ConcertFragment extends Fragment implements MyBackPressed {

private static final String FRAGMENT_TAG = "fragmentTag";
private static final String TAG = ConcertFragment.class.getSimpleName() ;
public ProgressBar progress;
private ConcertLoader concertLoader;
private RecyclerView recyclerView;
private Context mContext;
private android.support.v4.app.FragmentManager mFragmentManager;
private MainActivity mActivity;




@Override
public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    JodaTimeAndroid.init(getContext());
    View v = inflater.inflate(R.layout.fragment_concert_layout, container, false);
    progress = (ProgressBar) v.findViewById(R.id.progressBar);
    recyclerView = (RecyclerView) v.findViewById(R.id.concerts_rv);
    concertLoader = new ConcertLoader(ConcertFragment.this);
    mActivity = (MainActivity) getContext();
    futureConcerts();

    return v;
}
public void futureConcerts() {
    concertLoader.execute();
    getActivity().getWindow().getDecorView().getRootView().setClickable(false);
}
public void notifyAboutListCreation(List<Concert> res) {
    ConcertAdapter adapter = new ConcertAdapter(getActivity().getApplicationContext(), res, mActivity);
    recyclerView.setAdapter(adapter);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity().getApplicationContext()));
    progress.setVisibility(View.GONE);
    adapter.notifyDataSetChanged();
}

@Override
public void onBackPressed() {
    getActivity().finish();
}

}

1 个答案:

答案 0 :(得分:1)

前一段时间我遇到过类似的问题。您是否从非UI线程触发任何UI更新?也许来自听众内部?尝试使用以下代码来触发UI更新。

runOnUiThread(new Runnable(){
        @Override
        public void run(){
            ...
            adapter.notifyDataSetChanged();
            mListView.invalidateViews();
            mListView.refreshDrawableState();
            ...
        }
    });

就我个人而言,我现在已经开始将一个有问题的代码块包装在一个通用的try-catch块中,该块捕获Exception并查看是否有任何异常我监督(使用带有标记过滤器的终端上的logcat)。

(无法发表评论,所以以这种方式回答)