我正在尝试创建一个将从网络加载新闻的应用程序,并将动态更新.我正在使用RecyclerView并CardView显示内容.我Jsoup用来解析网站.我不认为我的代码是必需的,因为我的问题更具理论性而非实际性.我想了解使用动态更新的过程notifyDataSetChanged().在我的主要活动中,我获取所有标题并将它们添加到列表中.但我需要等待,直到所有项目都加载开始显示它们.我真的很感激,如果有人可以发布我正在尝试做的示例代码,因为我找不到很多关于组合的信息ViewHolder,Adapter并且RecyclerView.
android android-viewholder android-cardview recycler-adapter android-recyclerview
我想在Recyclerview中实现更多的加载.这是代码.代码来自github.https://gist.github.com/ssinss/e06f12ef66c51252563e
MainActivity代码:
package com.example.tatson.bila;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;
import com.example.tatson.bila.CardAdapter;
import com.example.tatson.bila.Config;
import com.example.tatson.bila.SuperHeroes;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.w3c.dom.Text;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener{
SwipeRefreshLayout swipeLayout;
LinearLayoutManager mLayoutManager;
// initially offset will be 0, later will be updated while parsing …Run Code Online (Sandbox Code Playgroud) 我有问题在水平回收视图中滚动.例如,如果我有10个项目,第一次,我能够滚动到最后一项,但如果我去第一项,然后再次滚动到最后一项,它不会移动到最后一项.
这个问题是否与滚动有关,如果是这种情况,我是否应该覆盖滚动.
这是我的片段类声明
LinearLayoutManager layoutManager
= new LinearLayoutManager(getActivity(), LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView)v. findViewById(R.id.recycler_view);
adapter = new MyRecyclerAdapter(getActivity());
mRecyclerView.setLayoutManager(layoutManager);
mRecyclerView.setAdapter(adapter);
Run Code Online (Sandbox Code Playgroud)
并在我的适配器中
public class MyRecyclerAdapter extends RecyclerView.Adapter<MyRecyclerAdapter.CustomViewHolder> {
private Context mContext;
JobSiteActivity mjobSiteActivity;
ImageLoader loader = null;
public MyRecyclerAdapter(Activity activity) {
this.mContext = activity;
mjobSiteActivity = (JobSiteActivity)activity;
loader = mjobSiteActivity.getImageLoader();
}
@Override
public CustomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.image_detail_fragment, null);
CustomViewHolder viewHolder = new CustomViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(CustomViewHolder customViewHolder, int i) {
//FeedItem …Run Code Online (Sandbox Code Playgroud) android horizontal-scrolling recycler-adapter android-recyclerview
我有一个RecyclerView带适配器的布局:
public class SimpleRecyclerAdapter extends RecyclerView.Adapter<SimpleViewHolder> {
protected List<JSONObject> data = new ArrayList<>();
public List<JSONObject> getData() { return data; }
}
Run Code Online (Sandbox Code Playgroud)
我更新它的适配器,如:
public void udpdateFromJson( JSONObject payload ) {
JSONArray msgs = payload.optJSONArray( "messages" );
for( int ix = 0; null != msgs && ix < msgs.length(); ix++ ){
JSONObject o = msgs.optJSONObject( ix );
if( loadingMore ) adapter.getData().add( 1 + ix, o );
else adapter.getData().add( o );
}
adapter.notifyDataSetChanged();
recyclerView.invalidate();
}
Run Code Online (Sandbox Code Playgroud)
问题是,只有当我触摸或滚动视图时才会看到新项目.
我错过了什么?
更新:
解决问题我更换了线
adapter.notifyDataSetChanged();
recyclerView.invalidate(); …Run Code Online (Sandbox Code Playgroud) 我想在RecyclerView广告中加载广告已成功加载,但在滚动时会出现这么多延迟
以下是我在Adapter的OnBindViewHolder方法中编写的代码
如何解决这个滞后?
((DealHolder) holder).adcardView.post(new Runnable() {
@Override
public void run() {
final NativeExpressAdView adView = new NativeExpressAdView(((DealHolder) holder).itemView.getContext());
final int adWidth = ((DealHolder) holder).adcardView.getWidth() - ((DealHolder) holder).adcardView.getPaddingLeft()
- ((DealHolder) holder).adcardView.getPaddingRight();
final int adHeight = ((DealHolder) holder).adcardView.getHeight() - ((DealHolder) holder).adcardView.getPaddingBottom()
- ((DealHolder) holder).adcardView.getPaddingTop();
final float scale = ((DealHolder) holder).adcardView.getResources().getDisplayMetrics().density;
AdSize adSize = new AdSize((int) (adWidth / scale), (int) (adHeight / scale));
adView.setAdSize(adSize);
adView.setAdUnitId(((DealHolder) holder).adcardView.getContext().getString(R.string.test_adunit_id));
AdRequest request = new AdRequest.Builder().addTestDevice("jjhjhbjhjhjhjhjhjhjh").build();
adView.loadAd(request);
adView.setAdListener(new AdListener() {
@Override
public void onAdLoaded() { …Run Code Online (Sandbox Code Playgroud) android admob android-cardview recycler-adapter android-recyclerview
实现此功能的最佳策略是什么:
我有一个水平的RecyclerView卡.每张卡都将实现整个屏幕,但我希望它显示下一张卡的一部分,如果它有多个项目则显示前一张卡.
我知道我可以通过android:layout_width在适配器上设置我的卡来实现这一点,使其具有250dp的特定DP而不是match_parent.但它看起来不是一个合适的解决方案.
这是我的代码:
使用RecyclerView的活动:
class ListPokemon : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val items = createListPokemons()
recyclerView.adapter = PokemonAdapter(items)
recyclerView.layoutManager = LinearLayoutManager(this, LinearLayoutManager.HORIZONTAL, false)
recyclerView.setHasFixedSize(true)
val pagerSnapHelper = PagerSnapHelper()
pagerSnapHelper.attachToRecyclerView(recyclerView)
}
private fun createListPokemons(): List<Pokemon> {
val pokemons = ArrayList<Pokemon>()
pokemons += createPokemon("Pikachu")
pokemons += createPokemon("Bulbasaur")
pokemons += createPokemon("Charmander")
pokemons += createPokemon("Squirtle")
return pokemons
}
private fun createPokemon(name: String) = Pokemon(name = name, height = 1, weight = 69, id = …Run Code Online (Sandbox Code Playgroud) 我想知道RecylerView的swapAdapter和notifyDatasetChanged方法有什么区别?修改数据时哪一个更好用?
我通过crashlytics得到了这个堆栈跟踪.我不知道问题出在哪里.
是否有任何替代的StaggeredGridLayoutManager,我可以用它来获得像布局一样的列表视图.
Fatal Exception: java.lang.ArrayIndexOutOfBoundsException: start < 0 || end > len. start=-1, end=11, len=11
at java.util.Arrays.checkStartAndEnd(Arrays.java:1745)
at java.util.Arrays.fill(Arrays.java:803)
at android.support.v7.widget.StaggeredGridLayoutManager$LazySpanLookup.invalidateAfter(SourceFile:2404)
at android.support.v7.widget.StaggeredGridLayoutManager.handleUpdate(SourceFile:1373)
at android.support.v7.widget.StaggeredGridLayoutManager.onItemsRemoved(SourceFile:1327)
at android.support.v7.widget.RecyclerView$6.dispatchUpdate(SourceFile:725)
at android.support.v7.widget.RecyclerView$6.onDispatchFirstPass(SourceFile:716)
at android.support.v7.widget.AdapterHelper.dispatchFirstPassAndUpdateViewHolders(SourceFile:316)
at android.support.v7.widget.AdapterHelper.dispatchAndUpdateViewHolders(SourceFile:302)
at android.support.v7.widget.AdapterHelper.applyRemove(SourceFile:182)
at android.support.v7.widget.AdapterHelper.preProcess(SourceFile:103)
at android.support.v7.widget.RecyclerView.processAdapterUpdatesAndSetAnimationFlags(SourceFile:2767)
at android.support.v7.widget.RecyclerView.onMeasure(SourceFile:2538)
at android.view.View.measure(View.java:16521)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
at android.view.View.measure(View.java:16521)
at android.support.v4.view.ViewPager.onMeasure(SourceFile:1489)
at android.view.View.measure(View.java:16521)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16521)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:719)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:455)
at android.view.View.measure(View.java:16521)
at android.support.v4.widget.DrawerLayout.onMeasure(SourceFile:940)
at android.view.View.measure(View.java:16521)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5134)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
at android.support.v7.widget.ContentFrameLayout.onMeasure(SourceFile:135)
at …Run Code Online (Sandbox Code Playgroud) 我在片段中有一个回收者视图,基本上我试图在回收者视图中加载歌曲列表.每行回收者视图包含一个imageview(用于专辑封面)和textview(用于歌曲名称).我遇到麻烦,当数据集的大小很大时,即当歌曲太多时,回收者视图滞后,应用程序最终给出ANR.我正在使用Glide在每行的imageview中加载专辑艺术.谷歌音乐播放器如何能够显示如此大量的歌曲而没有任何延迟?
编辑: 这是我的SongsFragment
public class SongsFragment extends Fragment {
static {
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true);
}
ProgressBar progressBar; // progress bar to show after every 30 items
NestedScrollView nestedScrollView; //for smooth scrolling of recyclerview as well as to detect the end of recyclerview
RecyclerView recyclerView;
ArrayList<Song> songMainList = new ArrayList<>(); //partial list in which items are added
ArrayList<Song> songAllList = new ArrayList<>(); //Complete List of songs
SongAdapter songsAdapter;
private LinearLayoutManager layoutManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, …Run Code Online (Sandbox Code Playgroud) android mediastore recycler-adapter android-recyclerview android-glide
DiffUtils.dispatchUpdatesTo(adapter) 不更新我的数组的大小 recyclerView
我的result尺寸大于当前尺寸itemList,但仅显示当前尺寸
如何显示我数组大小的变化DiffUtils?我认为使用notifyDatasetChanged()不正确。
这是我现在在适配器中执行的操作:
fun update(items: List<ITEM>) {
updateAdapterWithDiffResult(calculateDiff(items))
}
private fun updateAdapterWithDiffResult(result: DiffUtil.DiffResult) {
result.dispatchUpdatesTo(this)
}
private fun calculateDiff(newItems: List<ITEM>) =
DiffUtil.calculateDiff(DiffUtilCallback(itemList, newItems))
Run Code Online (Sandbox Code Playgroud)