我正在尝试使用Class B
更新recyclerview,但是recyclerview没有得到更新,我知道在堆栈溢出时会问很多类似的问题,我尝试了其中的大多数问题,但是似乎没有任何作用我的情况;
第一次将数据放入片段中时,我正在为适配器创建一个对象并将其设置为可以正常工作的recyclerview,但是下一次适配器已初始化时,我正试图通知给我一个适配器的适配器即使提供的列表不为空,也可以是空的recyclerview。
请提出建议。
RecyclerView代码
StartEventArgs
适配器代码:
Entered PageSwapSender
Entered Connect
Entered Handler
ViewHolder类
notifyDataSetChanged()
答案 0 :(得分:1)
尝试一下:将您的数据更新方法名称更改为 updateDataSet 并尝试一下
RecyclerView代码:
var width = 400;
var height = 300; //this is the double because are showing just the half of the pie
var radius = Math.min(width, height) / 2;
var labelr = radius + 30; // radius for label anchor
//array of colors for the pie (in the same order as the dataset)
var color = d3.scale.ordinal()
.range(['#2b5eac', '#0dadd3', '#ffea61', '#ff917e', '#ff3e41']);
data = [{
label: 'CDU',
value: 10
},
{
label: 'SPD',
value: 15
},
{
label: 'Die Grünen',
value: 8
},
{
label: 'Die Mitte',
value: 1
},
{
label: 'Frei Wähler',
value: 3
}
];
var vis = d3.select("#chart")
.append("svg") //create the SVG element inside the <body>
.data([data]) //associate our data with the document
.attr("width", width) //set the width and height of our visualization (these will be attributes of the <svg> tag
.attr("height", height)
.append("svg:g") //make a group to hold our pie chart
.attr('transform', 'translate(' + (width / 2) + ',' + (height / 2) + ')'); //move the center of the pie chart from 0, 0 to radius, radius
var arc = d3.svg.arc() //this will create <path> elements for us using arc data
.innerRadius(79)
// .outerRadius(radius);
.outerRadius(radius - 10) // full height semi pie
//.innerRadius(0);
var pie = d3.layout.pie() //this will create arc data for us given a list of values
.startAngle(-90 * (Math.PI / 180))
.endAngle(90 * (Math.PI / 180))
.padAngle(.02) // some space between slices
.sort(null) //No! we don't want to order it by size
.value(function(d) {
return d.value;
}); //we must tell it out to access the value of each element in our data array
var arcs = vis.selectAll("g.slice") //this selects all <g> elements with class slice (there aren't any yet)
.data(pie) //associate the generated pie data (an array of arcs, each having startAngle, endAngle and value properties)
.enter() //this will create <g> elements for every "extra" data element that should be associated with a selection. The result is creating a <g> for every object in the data array
.append("svg:g") //create a group to hold each slice (we will have a <path> and a <text> element associated with each slice)
.attr("class", "slice"); //allow us to style things in the slices (like text)
arcs.append("svg:path")
.attr("fill", function(d, i) {
return color(i);
}) //set the color for each slice to be chosen from the color function defined above
.attr("d", arc); //this creates the actual SVG path using the associated data (pie) with the arc drawing function
const textEl = arcs.append("svg:text")
.attr("class", "labels") //add a label to each slice
.attr("fill", "grey")
.attr("transform", function(d) {
var c = arc.centroid(d),
xp = c[0],
yp = c[1],
// pythagorean theorem for hypotenuse
hp = Math.sqrt(xp * xp + yp * yp);
return "translate(" + (xp / hp * labelr) + ',' +
(yp / hp * labelr) + ")";
})
.attr("text-anchor", "middle"); //center the text on it's origin
textEl.append('tspan')
.text(function(d, i) {
return data[i].label;
});
textEl.append('tspan')
.text(function(d, i) {
return data[i].value;
})
.attr('x', '0')
.attr('dy', '1.2em');
arcs.append("svg:text")
.attr("class", "labels")//add a label to each slice
.attr("fill", "grey")
.attr("transform", function(d) {
var c = arc.centroid(d),
xp = c[0],
yp = c[1],
// pythagorean theorem for hypotenuse
hp = Math.sqrt(xp*xp + yp*yp);
return "translate(" + (xp/hp * labelr) + ',' +
(yp/hp * labelr) + ")";
})
.attr("text-anchor", "middle") //center the text on it's origin
.text(function(d, i) { return d.data.value; })
.text(function(d, i) { return d.data.label; });
//tooltip
arcs.on("mouseover", function(d) {
d3.select("#tooltip")
.style("left", `${d3.event.clientX}px`)
.style("top", `${d3.event.clientY}px`)
.classed("hidden", false);
d3.select("#tooltip-data")
.html(`Label: ${d.data.label}<br>Value: ${d.data.value}`);
});
arcs.on("mouseout", function(d) {
d3.select("#tooltip")
.classed("hidden", true);
});
适配器代码:
private void showStateList(List<State> states) {
if (states != null) {
this.lstStates = states;
if (stateAdapter == null) {
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity());
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
stateFragmentBinding.stateRecyclerView.setLayoutManager(linearLayoutManager);
stateFragmentBinding.stateRecyclerView.addItemDecoration(new DividerItemDecoration(stateFragmentBinding.stateRecyclerView.getContext(),
linearLayoutManager.getOrientation()));
stateFragmentBinding.stateRecyclerView.setHasFixedSize(true);
stateAdapter = new StateAdapter(lstStates, this);
stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
} else {
stateAdapter.updateDataSet(lstStates);
}
}
}
查看持有人代码:
class StateAdapter extends RecyclerView.Adapter<StateViewHolder> {
private LayoutInflater inflater;
private StateClickListener stateClickListener;
private List<State> lstStateItem = new ArrayList<>();;
public StateAdapter(List<State> lstStateItem, StateClickListener stateClickListener) {
this.lstStateItem.addAll(lstStateItem);
this.stateClickListener = stateClickListener;
}
@NonNull
@Override
public StateViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
if (inflater == null)
inflater = LayoutInflater.from(viewGroup.getContext());
StateAdapterBinding stateAdapterBinding = StateAdapterBinding.inflate(inflater, viewGroup, false);
return new StateViewHolder(stateAdapterBinding, stateClickListener);
}
@Override
public void onBindViewHolder(@NonNull StateViewHolder stateViewHolder, int position) {
State state = lstStateItem.get(position);
stateViewHolder.bind(state, position);
}
@Override
public int getItemCount() {
return lstStateItem.size();
}
public void updateDataSet(List<State> states) {
this.lstStateItem.clear();
this.lstStateItem.addAll(states);
notifyDataSetChanged();
}
}
答案 1 :(得分:0)
尝试使用:
your_binding_instance.executePendingBindings()
您的viewholder类应如下所示:
class ViewHolder(binding) extends RecyclerView.ViewHolder(binding.root){
bind(item){
bindnig.item = item
binding.executePendingBindings()
}
}
答案 2 :(得分:0)
如果有人有更好的解决方法,请通过以下代码更改showStateList方法:
private void showStateList(List<State> states) {
if (states != null) {
this.lstStates = states;
if(stateAdapter == null){
stateAdapter = new StateAdapter(lstStates, this);
}
else {
stateAdapter.notifyStateChanged(lstStates);
}
stateFragmentBinding.stateRecyclerView.setAdapter(stateAdapter);
}
}